package com.hss.thread;
/*
Callable接口实际是属于Executor框架中的功能类，Callable接口与Runnable接口的功能类似，但提供了比Runnable更强大的功能，主要表现为以下的3点：
        （1）Callable可以在任务接受后提供一个返回值，Runnable无法提供这个功能。
        （2）Callable中的call()方法可以抛出异常，而Runnable的run()方法不能抛出异常。
        （3）运行Callable可以拿到一个Future对象，Future对象表示伊布计算的结果，他提供了检查计算是否完成的方法。由于线程属于异步计算模型，
        因此无法从别的线程中得到函数的返回值，在这种情况下就可以使用Future来监视目标线程调用call()方法的情况，
        但调用Future的get()方法以获取结果时，当前线程就会阻塞，直到call()方法的返回结果
        */
/**
 * Java并发编程（一）线程定义、状态和属性
 * https://www.jianshu.com/p/343f2e670069
 */

import java.util.concurrent.*;

public class TestCallable {

    public  static  class MyCallable implements Callable<String>{

        @Override
        public String call() throws Exception {
            return "heloo   world";
        }
    }

    public static void main(String[] args) {
//        FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
//        futureTask.run();
        ExecutorService mExecutorService = Executors.newSingleThreadExecutor();
        MyCallable callable = new MyCallable();
       Future<String> future = mExecutorService.submit(callable);
        try {
            //等待线程结束，并返回结果
            System.out.println(future.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
